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;
}
记得当初上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;
}
相关文章推荐
- [LeetCode]Sort List 链表排序 + Merge Two Sorted List 合并两个有序链表
- LeetCode 147. Insertion Sort List(插入有序链表)
- Sort List[leetcode] 由归并排序的递归和循环,到本题的两种解法
- LeetCode 147. Insertion Sort List插入排序链表的高效简单解法
- [LeetCode]Merge Two Sorted Lists & Remove Duplicates from Sorted List 两个有序链表合并为一个&删除链表重复元素
- [LeetCode系列]有序链表转换为平衡BST的递归解法
- LeetCode 刷题: 合并两个有序链表 (merge two sorted list)
- 【剑指offer】链表相关-合并两个有序链表&递归写法17
- LeetCode(Merge Two Sorted Lists ) 合并两个有序的链表
- 两有序链表合并为一个--递归与非递归两种方式
- 待字闺中之快排单向链表;leetcode之Sort List
- LeetCode Sort List(链表排序)
- 面试题17:合并两个有序链表(Leetcode-21:Merge Two Sorted Lists)
- leetcode Insertion Sort List(链表插入排序)
- 链表操作(将两个链表合并成一个链表依然有序,非递归方法和迭代方法)
- 有序链表的合并(递归实现)
- Merge Two Sorted Lists 合并两个有序链表@LeetCode
- [LeetCode]—Copy List with Random Pointer 深度复制带“任意指针”的链表
- 递归实现合并两个有序链表
- 给你两个有序链表,编写一个函数,把两个链表合并成一个新的有序链表,返回头指针