【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 ...
随机推荐
- SAP 采购订单行项目中科目分配被隐藏,发现行项目设置中显示字段长度为0
1.sm30 维护 视图 TCVIEW 修改对应字段的显示长度
- Android Studio线下版和线上版都使用正式签名脚本(保证keysore签名文件和项目在同级目录),不用再因为繁琐的发正式版而烦恼
场景:调用微信等第三方应用时如果生成的版本不是正式签名的可能会调用失败,使用如下脚本不用再为繁琐的发正式签名版而烦恼 app项目中的build.gradle追加如下代码: //使用正式签名脚本(保证k ...
- 如何在Mac OS X中显示隐藏的文件
打开终端,输入: defaults write com.apple.finder AppleShowAllFiles -bool true 显示文件夹中的隐藏文件. defaults write co ...
- Mac删除.DS_Store文件
1.删除.DS_Store文件 sudo find ./ -name ".DS_Store" -depth -exec rm {} \; 2.禁止生成此文件 defaults wr ...
- oracle 密码过期处理
1.查看用户的proifle是哪个,一般是default sql>SELECT username,PROFILE FROM dba_users; 2.查看指定概要文件(如default)的密码有 ...
- MyTtcp 测试网络带宽
网络编程学习 注意的指标MB/S 带宽每秒处理的信息 查询等 messages/s queries/s transaction/s延时cpu使用率 ttcp测试网络 读写读写 循环 测试网络带宽 正确 ...
- CMake 使用方法(转)
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的 ...
- Python 变量范围
1.本地变量,全局变量 Python 中有2种变量作用范围本地变量,全局变量. 变量搜索路径是:本地变量->全局变量 它们简而言之就是本地变量的值只在本地作用范围有效.而全局变量的作用范围是全局 ...
- 使用Sublime Text3开发AngularJs
之前的Sublime环境安装插件弄得有点乱,卸载了重新安装: 1. 安装sublime: https://www.sublimetext.com/3 2. 注册: —– BEGIN LICENSE — ...
- ZOJ3774_Power of Fibonacci
求fibonacci数列前N个数的K次方和. 通项公式:F[n]=((1+sqrt(5))/sqrt(5)-(1-sqrt(5))/sqrt(5))/sqrt(5). 有点乱,不过由于可以保证最后的结 ...