思路
每两个数之间进行一次求最大公约数,并将其插入两个节点之间
解题方法
max()函数用于求最大公约数,将其赋值给新的一个节点,并将其插入两个节点之间
注意:插入后,需要执行的是p.next.next,因为插入了一个节点,所以需要向后移动两次
复杂度
时间复杂度: O(n)
空间复杂度:O(n)
Code
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode insertGreatestCommonDivisors(ListNode head) {
int a,b;
ListNode p=head;
while(p.next!=null){
a=p.val;
b=p.next.val;
ListNode l=new ListNode();
if(a>=b)
l.val=max(a,b);
else
l.val=max(b,a);
l.next=p.next;
p.next=l;
p=p.next.next;
}
return head;
}
public int max(int a,int b){
if (b == 0) {
return a;
} else {
return max(b, a % b);
}
}
}
官方答案
class Solution {
public ListNode insertGreatestCommonDivisors(ListNode head) {
ListNode node = head;
while (node.next != null) {
node.next = new ListNode(gcd(node.val, node.next.val), node.next);
node = node.next.next;
}
return head;
}
public int gcd(int a, int b) {
while (b != 0) {
int tmp = a % b;
a = b;
b = tmp;
}
return a;
}
}
作者:力扣官方题解