题解 | #合并两个排序的链表#
合并两个排序的链表
https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337
合并两个排序的链表,这道题想了2h,而且最后也没完全通过所有案例!
在怀疑着是自己刷题太少还是说自己真的太蠢了
我一开始思路是首先找到第一个值最小的链表,把他当作起点,然后这个链表和第二个链表进行连接,连接完毕就步进,进行下一次连接!
这里出现的问题还挺多的,首先就是我默认以为第二链表就是最大的,也就是没有比较值,导致一部分样例没过,应该就是没有比较值导致的,
而且我使用的是在原链表上进行连接,因此难免会比较复杂,当时没想到用一个而外的链接去记录合并的,导致很多临界条件没处理好。
看了题解之后才发现原来自己才是个菜鸡!
题解理解之后就是首先创建一个节点用来记录合并后的节点,然后创建一个哨兵的节点(其实就是用来获取记录节点的头节点),之后开始while循环
循环条件就是下一个节点值不为null,如果是null直接退出,循环体就是比较谁的值比较小,把小的放进记录节点,然后原节点步进,最后记录节点也要步进,
循环结束后因为可能会有一些节点不为null,不为null的节点就直接放到记录节点(这里要注意一个节点会有下一个节点的地址,环环相扣,因此不必当心下一个节点存在,只要记录的地址还在就行)
不为null可能就是当前节点1一直都是比节点2小。
最后的最后就是返回了,返回不是直接返回记录节点,因为此时的记录节点地址是第n个,我们只需要返回记录节点的头节点即可,因为链表是环环相扣,有头节点就能一直找到下一个节点。因此我们通过
哨兵节点将头节点返回即可。一句话,真的是太秒了,我真是太菜了~
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode Merge(ListNode list1, ListNode list2) {
if (list1 == null || list2 == null) {
return list1 == null ? list2 == null ? null : list2 : list1;
}
ListNode list = new ListNode(0);
ListNode result = list;
while (list1 != null && list2 != null) {
if (list1.val > list2.val) {
list.next = list2;
list2 = list2.next;
} else {
list.next = list1;
list1 = list1.next;
}
list = list.next;
}
if (list1 != null) {
list.next = list1;
} else {
list.next = list2;
}
return result.next;
}
}