链接: https://leetcode-cn.com/problems/merge-k-sorted-lists/.
归并法
今天只做了这一个算法题,做到我快自闭了~先是理解归并的思想,接着在编好程序后,出现指针指向随机内存的问题;好不容易解决了指针的问题,多次提交,还总是出现超时的问题。反复检查代码,居然是在merge时候,左半边的list总是从0号链表开始merge的,我要炸了!果然还是太菜了。
写下在编程中遇到的问题,以及苦苦探寻解决办法的过程,希望能帮助到大家。
合并两个有序链表
首先,我们考虑只合并2个有序链表的合并的情况:
- 定义一个新的头结点pHead ,用于保存合并后的新链表的头部;
- 定义一个变量p,用于指向下一个插入位置的前一个位置(),pa,pb分别指两个链表待合并的剩下部分的第一个结点
- 当pa,pb不为空的时候,判断它们val值的大小进行合并;如果pa为空了,则将剩下的pb链表直接合并到新链表的后面;如果pb为空,则将剩下的pa链表直接合并到新链表后面;
- 在合并的过程中,将要合并的结点添加到p->nextt,然后改变p的指向,p=p->next;
代码:
//合并两个有序链表
ListNode* mergeTwoList(ListNode* a,ListNode* b){
if((!a)||(!b)) return a?a:b;
ListNode pHead,*p=&pHead,*pa=a,*pb=b;
//ListNode* pHead,*p=pHead;这样定义的两个变量都是一个指针,它们指向一个随机的地址,
//如果事先不给一个确切的ListNode的地址给他们俩,
//直接运行程序,可能会造成它们俩指向的内存被破坏,导致程序终止运行
//所以应该要先定义一个ListNode pHead的类型的变量,系统给这个变量分配了内存,然后再定义*p指向这个内存
while(pa&&pb){
if(pa->val<pb->val){
p->next=pa;
pa=pa->next;
}
else{
p->next=pb;
pb=pb->next;
}
p