解法都在代码里,不懂就留言或者私信
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
/**链表系列最简单的题之一,基本思路:先比较两个链表最小的节点(第一个节点)
确定合并之后的头,然后它在原始链表中的下一个作为被合并的头和另外一个链表进行比较
谁小下一个就是谁,直到某个链表为空,然后把另外一个链表剩余部分拼在最后 */
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
/**如果两个都为空,返回谁都无所谓,避免歧义,我就直接返回null了*/
if(list1 == null && list2 == null) {
return null;
}
/**某一个链表为空,返回另外一个 */
if(list1 == null || list2 == null) {
return list1 == null? list2 : list1;
}
/**合并之后链表的头*/
ListNode newHead = null;
/**当前合并过的最后一个节点 */
ListNode lastAccess = null;
/**如果都不为空,挨个比较确定下一个 */
while(list1 != null && list2 != null) {
/**确定当前要哪个节点 */
ListNode cur = list1.val <= list2.val? list1 : list2;
/**头为空说明这是两个链表的第一次比较,谁小谁作为头并且作为合并过的第一个节点 */
if(newHead == null) {
newHead = lastAccess = cur;
} else {
/**如果不是第一次比较,把lastAccess和它串起来,它作为最后一个合并过的节点 */
lastAccess.next = cur;
lastAccess = cur;
}
/**合并了谁谁跳,没有合并的不跳 */
list1 = cur == list1? list1.next : list1;
list2 = cur == list2? list2.next : list2;
}
/**list1没有用完的话,直接串到最后 */
if(list1 != null) {
lastAccess.next = list1;
}
/**list2没有用完的话,直接串到最后,两个if只可能出现一个,理论上也必须出现一个 */
if(list2 != null) {
lastAccess.next = list2;
}
return newHead;
}
}
执行结果