腾讯0906后端开发 笔试第一题 寻找链表的交集 升序输出 看到别人分享的题目 相到最近刚好复习了单链表 就来练练手吧

public class T_1_1 {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int l1 =Integer.parseInt(br.readLine());
String[] s1 = br.readLine().trim().split(" ");
ListNode2 r1 = new ListNode2(-1);
for (int i = l1-1; i >=0 ; i--) {
ListNode2 node=new ListNode2(Integer.parseInt(s1[i]));
node.next=r1.next;
r1.next=node;
}
int l2 =Integer.parseInt(br.readLine());
String[] s2 = br.readLine().trim().split(" ");
ListNode2 r2 = new ListNode2(-1);
for (int i = l2-1; i >=0 ; i--) {
ListNode2 node=new ListNode2(Integer.parseInt(s2[i]));
node.next=r2.next;
r2.next=node;
}
ListCommon(r1.next,r2.next,l1,l2);
}
private static void ListCommon(ListNode2 r1, ListNode2 r2, int l1, int l2) {
StringBuilder sb = new StringBuilder();
while (r1!=null&&r2!=null) {
if (r1.val == r2.val) {
sb.append(r1.val + " ");
r1 = r1.next;
r2 = r2.next;
} else if (r1.val > r2.val) {
r1 = r1.next;
} else {
r2 = r2.next;
}
}
System.out.println(sb.reverse().toString().trim());
}
}

几个注意点:
1)首先题目需要的输入是这样的:
/*输入语句
第一行:链表一的数据个数
第二行:链表一的构成,按照降序排列
第三行:链表二的数据个数
第四行:链表二的构成
*/
2)这边定义的r1和r2相当于头节点,因此下面调用的时候需要从r1和r2指向的下一个元素开始

3)选择stringbuilder用来存放公共元素,stringbuilder线程不安全,但效率比stringbuffer高,适用于单线程

4)找公共元素的思路其实很朴素,遍历,如果相等,就存起来,不相等就判断大小,因为两个链表本身是有序的,所以很好判断,是否该移动到下一个节点, 注意要在外层加循环判断链表是否循环到了最后一个元素;

posted @ 2020-09-08 10:56  静是本能  阅读(86)  评论(0编辑  收藏  举报