写点什么

性能优化练习

用户头像
Mars
关注
发布于: 2020 年 12 月 12 日

有两个单向链表(链表长度分别为 m,n),这两个单向链表有可能在某个元素合并,也可能不合并,如下图所示的这样。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是图中的 x 元素。

请用代码(或伪代码)描述算法,并给出时间复杂度。



public class LinkedListCheck {    private static int BOUND = 26;    private static LinkedList<String> aLinkedList = Lists.newLinkedList();    private static LinkedList<String> bLinkedList = Lists.newLinkedList();
String[] letterArray = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n" ,"o","p","q","r","s","t","u","v","w","x","y","z"};
public LinkedListCheck() { init(13,15); }
private void init(int m, int n) { aLinkedList.add("a"); aLinkedList.add("b"); aLinkedList.add("x"); aLinkedList.add("y"); aLinkedList.add("z");
bLinkedList.add("d"); bLinkedList.add("e"); bLinkedList.add("f"); bLinkedList.add("x"); bLinkedList.add("y"); bLinkedList.add("z");// buildLinked(aLinkedList, m);// buildLinked(bLinkedList, n); System.out.println(aLinkedList.toString()); System.out.println(bLinkedList.toString()); }
private void buildLinked(LinkedList<String> linkedList, int size) { for (int i = 0; i < size; i++) { Random random = new Random(); int index = random.nextInt(BOUND); linkedList.add(letterArray[index]); } }
private String findItem() { int m = aLinkedList.size(); int n = bLinkedList.size(); Map<String, Integer> resultMapA = Maps.newHashMap(); Map<String, Integer> resultMapB = Maps.newHashMap(); for (int i = 0; i < m || i < n; i++) { String a = null; if (i<m) { a = aLinkedList.get(i); } String b = null; if (i<n) { b = bLinkedList.get(i); } String resultA = null; if (StringUtils.isNotBlank(a)) { resultA = processMap(resultMapA, resultMapB, a); } if(resultA!=null) { return resultA; } else { String resultB = null; if (StringUtils.isNotBlank(b)) { resultB = processMap(resultMapB, resultMapA, b); } if(resultB!=null) { return resultB; } } } return null; }
private String processMap(Map<String, Integer> storeMap, Map<String, Integer> targetMap, String targetValue) { Integer value = targetMap.getOrDefault(targetValue, 0); if (value.intValue()>=1) { return targetValue; } else { Integer tempValue = storeMap.getOrDefault(targetValue, 0); storeMap.put(targetValue, ++tempValue); } return null; }
public static void main(String[] args) { LinkedListCheck linkedListCheck = new LinkedListCheck(); System.out.println("合并元素是:"+linkedListCheck.findItem()); }}
复制代码

结果如下:

时间复杂度:O(n)[a, b, x, y, z][d, e, f, x, y, z]合并元素是:x
复制代码


发布于: 2020 年 12 月 12 日阅读数: 27
用户头像

Mars

关注

还未添加个人签名 2018.06.12 加入

还未添加个人简介

评论

发布
暂无评论
性能优化练习