您的位置:首页 > 其它

merge two sort list-leetcode 有序链表合并的二级指针简洁非递归解法

2017-03-24 15:49 281 查看
【注,本方法并没有在效率上优于同类非递归解法,只是统一了部分逻辑,增加了代码的简洁】

记得当初上c++课的时候,Mr.Lu提到过,链表里因为头指针是指针而非节点的缘故,因此在很多时候处理链表时需要写不同的代码处理头指针Node*和后续的Node。但是当引入二级指针之后,很多逻辑又能统一。因为一般对指针进行重绑定的时候是在Node结构体中的Node*中,这跟头指针是一致的。

合并两个有序链表的时候,要么递归,要么非递归。递归的代码看起来少,但是每有一个节点便递归一次,效率就不谈了。。

而非递归的一般做法

1.先进行指针判空

2.当两者都不为空的时候,选择其中一个链表,将其中的元素插入结果链表,直到一张链表为空

3.最后将另一张非空链表中的元素全部加到目标链表中(这一步倒是简单,一句话就可以写完)

因此代码并会显得挺长。

可以看出,上述的操作里有共同的部分:将某一个链表的第一个元素取下,加到新链表中。 这时候c/c++提供指针的好处就体现出来了。【多说句,指针这些概念我觉得就是方便了抽象,站在一个更高的层面去处理一系列操作。比如int指针可以操纵多个int变量,只要你绑定好了。】同样,由于链表是用一级指针表示,那么我们可以用更高一级的二级指针去操作一系列的链表,完成公共操作的副本。

因此以下代码使用cur指针统一了头指针与节点的操作;用min指针统一了非递归做法的2、3两步操作。ListNode *mergeTwoLists(ListNode *h1, ListNode *h2) {
ListNode *head=NULL,**cur=&head,**min;
while(h1||h2){
min=!h2||h1&&h1->val<h2->val ? &h1:&h2;
*cur=*min; //insert to the ans list;
cur=&(*cur)->next; //update the next insert position
*min=(*min)->next; //min pointer move
}
return head;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息