go语言快速刷《程序员面试金典》(3)

举报
兔老大 发表于 2021/04/21 23:41:20 2021/04/21
【摘要】 编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。 示例: 输入: head = 3->5->8->5->10->2->1, x = 5 输出: 3->1-...

编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。

示例:

输入: head = 3->5->8->5->10->2->1, x = 5
输出: 3->1->2->10->5->5->8

一趟分离,然后连起来即可。


  
  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int
  5. * Next *ListNode
  6. * }
  7. */
  8. func partition(head *ListNode, x int) *ListNode {
  9. if head == nil{
  10. return nil
  11. }
  12. dummnyhead1,dummnyhead2 := &ListNode{-1,nil},&ListNode{-1,nil}
  13. cur1,cur2 := dummnyhead1,dummnyhead2
  14. cur := head
  15. for cur != nil{
  16. if cur.Val <x{
  17. cur1.Next = cur
  18. cur = cur.Next
  19. cur1 = cur1.Next
  20. }else if cur.Val >=x{
  21. cur2.Next = cur
  22. cur = cur.Next
  23. cur2 = cur2.Next
  24. }
  25. }
  26. cur2.Next = nil
  27. cur1.Next = dummnyhead2.Next
  28. return dummnyhead1.Next
  29. }

给定两个用链表表示的整数,每个节点包含一个数位。

这些数位是反向存放的,也就是个位排在链表首部。

编写函数对这两个整数求和,并用链表形式返回结果。

 

示例:

输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
进阶:假设这些数位是正向存放的,请再做一遍。

示例:

输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912

模拟竖式计算即可。


  
  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int
  5. * Next *ListNode
  6. * }
  7. */
  8. func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
  9. up:=0;
  10. ans:= &ListNode{-1,nil};
  11. temp:=ans;
  12. for l1!=nil || l2!=nil{
  13. a,b:=0,0;
  14. if(l1!=nil){
  15. a=l1.Val;
  16. }
  17. if(l2!=nil){
  18. b=l2.Val;
  19. }
  20. temp.Next=&ListNode{(a+b+up)%10,nil};
  21. up=int((a+b+up)/10);
  22. temp=temp.Next;
  23. if(l1!=nil){
  24. l1=l1.Next;
  25. }
  26. if(l2!=nil){
  27. l2=l2.Next;
  28. }
  29. }
  30. if(up!=0){
  31. temp.Next=&ListNode{up,nil};
  32. }
  33. return ans.Next;
  34. }

编写一个函数,检查输入的链表是否是回文的。

 

示例 1:

输入: 1->2
输出: false 
示例 2:

输入: 1->2->2->1
输出: true 

其实最优解应该原地反转一半,判断完再反转回去,我这个题是为了连一下go的列表。


  
  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int
  5. * Next *ListNode
  6. * }
  7. */
  8. func isPalindrome(head *ListNode) bool {
  9. s:=make([]int,0)
  10. for head!=nil{
  11. s= append(s, head.Val)
  12. head=head.Next
  13. }
  14. for i:=0;i< len(s)/2;i++{
  15. if s[i]!=s[len(s)-1-i]{
  16. return false
  17. }
  18. }
  19. return true
  20. }

给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。


示例 1:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

思路:调到长度一样以后,看能否走到一样的节点即可。


  
  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int
  5. * Next *ListNode
  6. * }
  7. */
  8. func getIntersectionNode(headA, headB *ListNode) *ListNode {
  9. a,b:=0,0;
  10. for temp:=headA;temp!=nil;temp=temp.Next{
  11. a++;
  12. }
  13. for temp:=headB;temp!=nil;temp=temp.Next{
  14. b++;
  15. }
  16. if(a>b){
  17. for i:=a-b;i>0;i--{
  18. headA=headA.Next;
  19. }
  20. }else if(a<b){
  21. for i:=b-a;i>0;i--{
  22. headB=headB.Next;
  23. }
  24. }
  25. for headA!=nil && headB!=nil{
  26. if(headA==headB){
  27. return headA;
  28. }
  29. headA=headA.Next;
  30. headB=headB.Next;
  31. }
  32. return nil;
  33. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/106203421

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。