【leetcode】Merge Two Sorted Lists
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
题目意思很简单,就是合并两个有序链表,头需要是原先的两个链表中的一个。这道题在本科生的数据结构书上就有讲,原理就就是:两个链表A,B分别逐个遍历,判断两个元素的大小,取小的作为新链表的下一个节点。让小学生做,他们也能知道原理,但是这里我是用python写的,调试了好久才得到结果,主要的原因就出在python本身的机制上。先贴代码,再细说:
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None class Solution:
# @param two ListNodes
# @return a ListNode
def mergeTwoLists(self, l1, l2):
p1 = l1
p2 = l2
if l1 == None:
return l2
if l2 == None:
return l1
if l1.val < l2.val:
#print 'choose:1'
h = ListNode(l1.val)
hm = h
while(p1.next != None and p2 != None):
#print p1.val,p2.val
if p1.next.val > p2.val:
tempnode = ListNode(p2.val) #注意,此处需要注意,不要使用赋值语句,使用赋值语句你就完了!
h.next = tempnode
h = tempnode
p2 = p2.next
else:
tempnode = ListNode(p1.next.val)
h.next = tempnode
h = h.next
p1 = p1.next
print h.val
if p1.next == None: #l1遍历完了
h.next = p2
else:
h.next = p1.next
return hm
else:
#print 'choose:2'
h = ListNode(l2.val)
hm = h
while(p1 != None and p2.next != None):
if p2.next.val > p1.val:
tempnode = ListNode(p1.val)
h.next = tempnode
h = tempnode
p1 = p1.next
else:
tempnode = ListNode(p2.next.val)
h.next = tempnode
h = h.next
p2 = p2.next
print h.val
if p1 == None: #l1遍历完了
h.next = p2.next
else:
h.next = p1
return hm
最主要的问题就出在新链表h的构建问题上,起初,我用的不是:
tempnode = ListNode(p2.val)
h.next = tempnode
h = tempnode
而是使用的:
h.next = p1.next
h = h.next
这就造成了一个指针的混乱,原因就出在python的拷贝机制上。python的拷贝机制有三种,例子如下:
import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用
c = copy.copy(a) #对象拷贝,浅拷贝
d = copy.deepcopy(a) #对象拷贝,深拷贝 a.append(5) #修改对象a
a[4].append('c') #修改对象a中的['a', 'b']数组对象
b.append(1) print 'a = ', a
print 'b = ', b
print 'c = ', c
print 'd = ', d 结果如下:
a = [1, 2, 3, 4, ['a', 'b', 'c'], 5, 1]
b = [1, 2, 3, 4, ['a', 'b', 'c'], 5, 1]
c = [1, 2, 3, 4, ['a', 'b', 'c']]
d = [1, 2, 3, 4, ['a', 'b']]
我之前所用的复制方式,就是采用的第一种,将新链表和P1关联起来,这样,一旦h发生改变之后,p1也发生了改变。造成了指针的混乱,所以我这次采用的方式是:对于新链表,每次要添加一个元素的时候,就新建一个节点,把要添加的元素的值赋值给它,这样就不会发生混乱了。
【leetcode】Merge Two Sorted Lists的更多相关文章
- 【leetcode】Merge k Sorted Lists
Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...
- 【leetcode】Merge Two Sorted Lists(easy)
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- 【leetcode】Merge k Sorted Lists(按大小顺序连接k个链表)
题目:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity ...
- 【LeetCode】Merge Two Sorted Lists(合并两个有序链表)
这道题是LeetCode里的第21道题. 题目描述: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1-&g ...
- 【Leetcode】【Hard】Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 解 ...
- 【Leetcode】【Easy】Merge Two Sorted Lists .
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- 【LeeCode23】Merge k Sorted Lists★★★
1.题目描述: 2.解题思路: 题意:将K个已经排序的链表合并成一个排序的链表,分析并描述所用算法的复杂度. 方法一:基于“二分”思想的归并排序.本文用非递归和递归两种方法实现. (1)非递归:归并排 ...
- 【LeetCode21】Merge Two Sorted Lists★
1.题目描述: 2.解题思路: 本题是要合并两个已经有序的单链表,思路很简单,有两种方法:非递归和递归. 3.Java代码: (1)非递归: 为方便操作,定义一个辅助的头节点,然后比较原来两个链表的头 ...
- 【LeetCode-easy】Merge Two Sorted Lists
思路:指针p用于串联怎个链表,比较两个指针的大小,连接较小的一个.如果一个链表到达链尾,连接另外一个链表余下来的所以节点. public ListNode mergeTwoLists(ListNode ...
随机推荐
- RHEL6.7 x64双节点安装Oracle 11g r2 RAC
基础环境 使用两台HP DL580服务器作为RAC节点,存储使用IBM V7000.具体环境如下: 设备 用途 IP地址 磁盘空间 HP DL580 RAC节点01 RAC01-pub:116.1.1 ...
- 自定义View(二)增加View的属性
增加View的属性有两种方法 1.在View类中添加 2.在xml资源文件中添加 一.在View类中添加 例:实现一个带文字的图片 public class MyView exten ...
- transform-style: preserve-3d在iphone下的bug
经测,当元素设置transform-style: preserve-3d;后,其实现rotateY时的动画效果会穿透上层的覆盖图层. 马克一下
- factory service provide自定义服务
1.factory factory , 就是你提供一个方法, 该方法返回一个对象的实例, 对于 AngularJS 的 factory 来说, 就是先定义一个对象, 给这个对象添加属性和方法, 然后返 ...
- XE3随想14:关于 SO 与 SA 函数
通过 SuperObject 的公用函数 SO 实现一个 ISuperObject 接口非常方便; 前面都是给它一个字符串参数, 它的参数可以是任一类型甚至是常数数组. SA 和 SO 都是返回一 I ...
- .NET entityframework for mysql ,datetime字段存储值时有误差
昨天Tester发现数据有问题,大部分时间“datetime类型”都多了一秒,很少一部分数据的时间能完全对上(年月日时分秒),因为缺少关键日志,就各种排查,最后发现在调用Savechange方法前一刻 ...
- 第三次作业——《K米评测》
第三次作业--<K米评测> 一.调研.评测 上手体验 APP的图标做的不错,一眼就知道和KTV唱歌相关的 点进去就是连接包箱的界面和直播界面,把软件最重要的两个功能展示出来了,一目了然 热 ...
- WebView加载HTML图片大小自适应与文章自动换行
http://www.brighttj.com/ios/ios-webview-load-html-image-adaptive.html 在很多App中都会使用到webview,尤其是在加载新闻内容 ...
- ubuntu linux mysql 安装 基本操作 命令
mysql --help #如果有信息证明系统已经安装了mysql mysql -V #查看版本号 netstat -tap|grep mysql #检查mysql是否在启动状态 卸载mysql: s ...
- html5新特性之拖放
1.元素是否可拖动可放置 draggable="true" 设置元素可以拖动 ondragover="allowDrop(event)" 元素默认不能放置,加 ...