07
4
内容纲要
最近开始刷leetcode,刷了一周时间,确实会上瘾,不过能巩固很多基础知识,包括算法和语言。我现在是架构与编码并行。今天遇到的是两个列表的合并,刚开始我自己写了一个笨方法来合并,虽然通过了测试,但是代码质量不高,于是研究了其他人写的代码。
//传入的两个链表本身是从小到大排序好
public ListNode MergeTwoLists(ListNode list1, ListNode list2)
{
ListNode head = new ListNode(); //定义新的链表头
ListNode current = head;//定义链表最新的next地址
//遍历两个链表,任何一个完毕后就终止循环
while (list1 != null && list2 != null)
{
if (list1.val < list2.val)
{
//如果list1的元素值小,则把当前list1赋予current.next,注意这里相当于head.next
current.next = list1;
list1 = list1.next;
}
else
{
current.next = list2;
list2 = list2.next;
}
//将current变量指向current.next,相当于head.next,当进入下一次循环给current.next赋值的时候,相当于是给head.next.next赋值了,一直这么循环到最后
current = current.next;
}
//head链表的next指向未循环完成的部分
current.next = list1 == null ? list2 : list1;
//返回合并后的链表
return head.next;
}
我刚开始发懵了,居然没理解这部分代码,因为忽略了“每次循环之后current的引用指向已经发生变化”。